<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Introdu&ccedil;&atilde;o - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.acl.introduction.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.acl.introduction.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.html">Zend_Acl</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.acl.refining.html">Refinando Controles de Acesso</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.acl.introduction" class="section"><div class="info"><h1 class="title">Introdução</h1></div>
    

    <p class="para">
        <span class="classname">Zend_Acl</span> fornece uma implementação de lista de controle de acesso
        (<acronym class="acronym">ACL</acronym>, na sigla em inglês) leve e flexível para a gestão privilégios.
        Em geral, uma aplicação pode utilizar essa <acronym class="acronym">ACL</acronym> para controlar o acesso a
        determinados objetos protegidos por outros objetos requerentes.
    </p>

    <p class="para">
        Para o propósito desta documentação:
    </p>

    <ul class="itemizedlist">
        <li class="listitem">
            <p class="para">
                Um <em class="emphasis">recurso</em> é um objeto cujo acesso é controlado
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                Um <em class="emphasis">papel</em> é um objeto que pode solicitar acesso a um Recurso.
            </p>
        </li>
    </ul>

    <p class="para">
        De modo simples, <em class="emphasis">papéis requisitam acesso a recursos</em>. Por exemplo, se
        um atendente de estacionamento solicita acesso ao um carro, o atendente é o papel
        requisitante e o carro é o recurso, pois o acesso ao carro pode não ser garantido a qualquer
        um.
    </p>

    <p class="para">
        Através da especificação e uso de uma <acronym class="acronym">ACL</acronym>, uma aplicação pode controlar
        como os papéis têm acesso aos recursos.
    </p>

    <div class="section" id="zend.acl.introduction.resources"><div class="info"><h1 class="title">Recursos</h1></div>
        

        <p class="para">
            A criação de um recurso em <span class="classname">Zend_Acl</span> é muito simples.
            <span class="classname">Zend_Acl</span> fornece um meio,
            <span class="classname">Zend_Acl_Resource_Interface</span>, para facilitar a criação de recursos
            em uma aplicação. Uma classe precisa apenas implementar esta interface, que consiste em
            um único método,  <span class="methodname">getResourceId()</span>, para que
            <span class="classname">Zend_Acl</span> reconheça o objeto como um recurso. Adicionalmente,
            <span class="classname">Zend_Acl_Resource</span> é fornecida por <span class="classname">Zend_Acl</span>
            como uma implementação básica de recurso para que desenvolvedores a extendam conforme
            necessário.
        </p>

        <p class="para">
            <span class="classname">Zend_Acl</span> fornece uma estrutura de árvore na qual múltiplos
            recursos podem ser adicionados. Como os recursos são armazenados em uma estrutura de
            árvore, eles podem ser organizados do geral (em direção à raiz da árvore) para o
            específico (em direção às folhas da árvore). Consultas em um recurso específico irá
            automaticamente pesquisar sua hierarquia por regras definidas em recursos ancenstrais,
            permitindo herança simplificada de regras. Por exemplo, se uma regra deve ser aplicada a
            cada construção em uma cidade, pode-se simplesmente aplicar a regra à cidade, ao invés
            de atribuir a mesma regra para cada construção. Contudo, algumas construções podem
            necessitar de exceções para tal regra e isto pode ser feito em
            <span class="classname">Zend_Acl</span> atribuindo tal exceção a cada construção que a
            necessite. Um recurso pode descender de apenas um recurso pai, embora este recurso pai
            pode possuir seu próprio pai, etc.
        </p>

        <p class="para">
            <span class="classname">Zend_Acl</span> também suporta privilégios em recursos (ex., &quot;criar&quot;,
            &quot;ler&quot;, &quot;atualizar&quot;, &quot;excluir&quot;) e o desenvolvedor pode atribuir regras que afetam todos
            os privilégios ou apenas privilégios específicos em um ou mais recursos.
        </p>
    </div>

    <div class="section" id="zend.acl.introduction.roles"><div class="info"><h1 class="title">Papéis</h1></div>
        

        <p class="para">
            Assim como recursos, criar um papel é também muito simples. Todos os papéis devem
            implementar <span class="classname">Zend_Acl_Role_Interface</span>. Esta interface consiste
            em um único método,  <span class="methodname">getRoleId()</span>. Adicionalmente,
            <span class="classname">Zend_Acl_Role</span> é fornecida por <span class="classname">Zend_Acl</span>
            como uma implementação de papel básica da qual desenvolvedores podem extender,
            quando necessário.
        </p>

        <p class="para">
            Em <span class="classname">Zend_Acl</span>, um papel pode derivar de um ou mais papéis. Isto
            é para suportar herança de regras através de papéis. Por exemplo, um papel de usuário,
            tal como &quot;sally&quot;, pode derivar de um ou mais papéis pai, como &quot;editor&quot; e
            &quot;administrador&quot;. O desenvolvedor pode atribuir regras para &quot;editor&quot; e &quot;administrador&quot;
            separadamente, e &quot;sally&quot; herdará tais regras de ambos, sem a necessidade de atribuir
            regras diretamente a &quot;sally&quot;.
        </p>

        <p class="para">
            Embora a abilidade de herdaer de múltiplios papéis seja muito útil, herança múltipla
            também introduz algum grau de complexidade. O exemplo a seguir ilustra a condição
            ambígua e como <span class="classname">Zend_Acl</span> a soluciona.
        </p>

        <div class="example" id="zend.acl.introduction.roles.example.multiple_inheritance"><div class="info"><p><b>Example #1 Herança múltipla através de Papéis</b></p></div>
            

            <div class="example-contents"><p>
                O código a seguir define três papéis fundamentais - &quot;visitante&quot;, &quot;membro&quot; e
                &quot;admin&quot; - dos quais outros papéis irão descender. Então, um papel identificado por
                &quot;algumUsuario&quot; é estabelecido e descende dos outros três papéis. A ordem em que
                estes papéis aparecem no array <var class="varname">$parents</var> é importante. Quando
                necessário, <span class="classname">Zend_Acl</span> procura por regras de acesso definidas
                não somente para o papél consultado (aqui, &quot;algumUsuario&quot;), mas também em papéis
                do qual o papel consultado descende (aqui, &quot;visitante&quot;, &quot;membro&quot; e &quot;admin&quot;):
            </p></div>

            <pre class="programlisting brush: php">
$acl = new Zend_Acl();

$acl-&gt;addRole(new Zend_Acl_Role(&#039;visitante&#039;))
    -&gt;addRole(new Zend_Acl_Role(&#039;membro&#039;))
    -&gt;addRole(new Zend_Acl_Role(&#039;admin&#039;));

$parents = array(&#039;visitante&#039;, &#039;membro&#039;, &#039;admin&#039;);
$acl-&gt;addRole(new Zend_Acl_Role(&#039;algumUsuario&#039;), $parents);

$acl-&gt;add(new Zend_Acl_Resource(&#039;algumRecurso&#039;));

$acl-&gt;deny(&#039;visitante&#039;, &#039;algumRecurso&#039;);
$acl-&gt;allow(&#039;membro&#039;, &#039;algumRecurso&#039;);

echo $acl-&gt;isAllowed(&#039;algumUsuario&#039;, &#039;algumRecurso&#039;) ? &#039;permitido&#039; : &#039;negado&#039;;
</pre>


            <div class="example-contents"><p>
                Como não há regra especificamente definida para o papel &quot;algumUsuario&quot; e
                &quot;algumRecurso&quot;, <span class="classname">Zend_Acl</span> deve procurar por regras que tenham
                sido definidas para papéis dos quais &quot;algumUsuario&quot; descende. Primeiro, o papel
                &quot;admin&quot; é visitado e não há regra de acesso definida para ele. Depois, o papel
                &quot;membro&quot; é visitado e <span class="classname">Zend_Acl</span> verifica que há uma regra
                especificando que &quot;membro&quot; tem acesso permitido a &quot;algumRecurso&quot;.
            </p></div>

            <div class="example-contents"><p>
                Se <span class="classname">Zend_Acl</span> continuar examinando as regras definidas para
                outros papéis pai, contudo, ela encontrará que &quot;visitante&quot; tem acesso negado a
                &quot;algumRecurso&quot;. Este é o fato que introduz uma ambiguidade, pois agora
                &quot;algumUsuario&quot; possui, ao mesmo tempo, acesso negado e permitido a &quot;algumRecurso&quot;,
                pelo motivo de herdar regras conflitantes de diferentes papéis pai.
            </p></div>

            <div class="example-contents"><p>
                <span class="classname">Zend_Acl</span> soluciona esta ambiguidade concluindo a consulta
                quando ela encontra a primeira regra diretamente aplicável a consulta. Neste caso,
                como o papel &quot;membro&quot; é examinado antes do papel &quot;visitante&quot;, o código de exemplo
                exibirá &quot;permitido&quot;.
            </p></div>
        </div>

        <blockquote class="note"><p><b class="note">Note</b>: 
            <p class="para">
                Quando especificando múltiplos pais para um papel, tenha em mente que o último pai
                listado será o primeiro buscado para regras aplicáveis a uma consulta de
                autorização.
            </p>
        </p></blockquote>
    </div>

    <div class="section" id="zend.acl.introduction.creating"><div class="info"><h1 class="title">Criando Listas de Controle de Acesso</h1></div>
        

        <p class="para">
            Uma Lista de Controle de Acesso (<acronym class="acronym">ACL</acronym>, na sigla em inglês) pode
            representar qualquer conjunto de objetos físicos ou virtuais que você desejar. Contudo,
            para o propósito de demonstração, criaremos uma <acronym class="acronym">ACL</acronym> básica de um
            Sistema de Gerenciamento de Conteúdo (<acronym class="acronym">CMS</acronym>, na sigla em inglês) que
            mentém diversas camadas de grupos através de uma grande variedade de áreas. Para criar
            um novo objeto <acronym class="acronym">ACL</acronym>, instanciamos a <acronym class="acronym">ACL</acronym> sem
            parâmetros:
        </p>

        <pre class="programlisting brush: php">
$acl = new Zend_Acl();
</pre>


        <blockquote class="note"><p><b class="note">Note</b>: 
            <p class="para">
                A menos que um desenvolvedor especifique uma regra &quot;allow&quot; (permitir - em inglês),
                <span class="classname">Zend_Acl</span> negará acesso a todo privilégio em todo recurso para
                todo papel.
            </p>
        </p></blockquote>
    </div>

    <div class="section" id="zend.acl.introduction.role_registry"><div class="info"><h1 class="title">Registrando Papéis</h1></div>
        

        <p class="para">
            O <acronym class="acronym">CMS</acronym> irá quase sempre necessitar de uma hierarquia de permissões
            para determinar as capacidades de autoridade de seus usuários. Pode haver um grupo
            &#039;Visitante&#039; para permitir acesso limitado para demonstrações, um grupo &#039;Equipe&#039; para
            que a maioria dos usuários do <acronym class="acronym">CMS</acronym> que executam grande parte das
            operações diárias, um grupo &#039;Editor&#039; responsável pela publicação, revisão, arquivamento
            e exclusão de conteúdo, e finalmente um grupo &#039;Administrador&#039; cujas tarefas podem
            incluir todas as de outros grupos bem como a manutenção de informações sensíveis,
            gerenciamento de usuários, configuração de back-end, dados de configuração, cópias de
            segurança e exportação. Este conjunto de permissões podem ser representadas em um
            registro de papéis, permitindo a cada grupo herdar privilégios de grupos &#039;pai&#039;, assim
            como fornecer privilégios distintos para grupos únicos. As permissões podem ser
            expressas como:
        </p>

        <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls" class="doctable table"><div class="info"><caption><b>Controles de Acesso para um CMS de Exemplo</b></caption></div>
            
            
                <thead valign="middle">
                    <tr valign="middle">
                        <th>Nome</th>
                        <th>Permissões Únicas</th>
                        <th>Permissões herdadas de</th>
                    </tr>

                </thead>


                <tbody valign="middle" class="tbody">
                    <tr valign="middle">
                        <td align="left">Visitante</td>
                        <td align="left">Visualizar</td>
                        <td align="left">N/D</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left">Equipe</td>
                        <td align="left">Editar, Enviar, Revisar</td>
                        <td align="left">Visitante</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left">Editor</td>
                        <td align="left">Publicar, Arquivar, Excluir</td>
                        <td align="left">Equipe</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left">Administrador</td>
                        <td align="left">(Todos os acessos garantidos)</td>
                        <td align="left">N/D</td>
                    </tr>

                </tbody>
            
        </table>


        <p class="para">
            Para este exemplo, <span class="classname">Zend_Acl_Role</span> é usado, mas qualquer objeto
            que implemente <span class="classname">Zend_Acl_Role_Interface</span> é aceitável. Estes
            grupos podem ser adicionados ao registro de papéis, como a seguir:
        </p>

        <pre class="programlisting brush: php">
$acl = new Zend_Acl();
// Adiciona grupos ao registro de papéis usando Zend_Acl_Role
// &#039;Visitante&#039; não herda controles de acesso
$roleGuest = new Zend_Acl_Role(&#039;visitante&#039;);
$acl-&gt;addRole($roleGuest);

// &#039;Equipe&#039; descende de &#039;Visitante&#039;
$acl-&gt;addRole(new Zend_Acl_Role(&#039;equipe&#039;), $roleGuest);

/*
Alternativamente, o código acima poderia ser escrito como:
$acl-&gt;addRole(new Zend_Acl_Role(&#039;equipe&#039;), &#039;visitante&#039;);
*/

// &#039;Editor&#039; descende de &#039;Equipe&#039;
$acl-&gt;addRole(new Zend_Acl_Role(&#039;editor&#039;), &#039;equipe&#039;);

// &#039;Administrador&#039; não herda controles de acesso
$acl-&gt;addRole(new Zend_Acl_Role(&#039;administrator&#039;));
</pre>

    </div>

    <div class="section" id="zend.acl.introduction.defining"><div class="info"><h1 class="title">Definindo Controles de Acesso</h1></div>
        
        <p class="para">
            Agora que a <acronym class="acronym">ACL</acronym> contém os papéis relevantes, regras podem ser
            estabelecidas para definir quais recursos podem ser acessados por quais papéis. Você
            pode notar que não definimos nenhum recurso em particular para este exemplo, que é
            simplificado para ilustrar que regras se aplicam a todos os recursos.
            <span class="classname">Zend_Acl</span> fornece uma implementação onde regras necessitam apenas
            serem atribuidas do caso geral para o específico, minimizando o número de regras
            necessárias, pois recursos e papéis herdam regras definidas em seus ancestrais.
        </p>

        <blockquote class="note"><p><b class="note">Note</b>: 
            <p class="para">
                Em geral, <span class="classname">Zend_Acl</span> obedecerá uma regra dada se e somente se
                uma regra mais específica não for aplicável.
            </p>
        </p></blockquote>

        <p class="para">
            Consequentemente, podemos definir um conjunto razoavelmente complexo de regras com o
            mínimo de código. Para aplicar as permissões básicas, tal como definido acima:
        </p>

        <pre class="programlisting brush: php">
$acl = new Zend_Acl();

$roleGuest = new Zend_Acl_Role(&#039;visitante&#039;);
$acl-&gt;addRole($roleGuest);
$acl-&gt;addRole(new Zend_Acl_Role(&#039;equipe&#039;), $roleGuest);
$acl-&gt;addRole(new Zend_Acl_Role(&#039;editor&#039;), &#039;equipe&#039;);
$acl-&gt;addRole(new Zend_Acl_Role(&#039;administrador&#039;));

// &#039;Visitante&#039; pode apenas visualizar conteúdo
$acl-&gt;allow($roleGuest, null, &#039;visualizar&#039;);

/*
Alternatively, the above could be written:
$acl-&gt;allow(&#039;visitante&#039;, null, &#039;visualizar&#039;);
//*/

// &#039;Equipe&#039; herda privilégios de &#039;Visitante&#039;, porém precisa de
// privilégios adicionais
$acl-&gt;allow(&#039;equipe&#039;, null, array(&#039;editar&#039;, &#039;enviar&#039;, &#039;revisar&#039;));

// &#039;Editor&#039; herda os privilégios visualizar, editar, enviar, e revisar de
// &#039;Equipe&#039;, mas também precisa de privilégios adicionais
$acl-&gt;allow(&#039;editor&#039;, null, array(&#039;publicar&#039;, &#039;arquivar&#039;, &#039;excluir&#039;));

// Administrador não herda nada, mas têm acesso a tudo
$acl-&gt;allow(&#039;administrador&#039;);
</pre>


        <p class="para">
            Os valores <b><tt>NULL</tt></b> nas chamadas  <span class="methodname">allow()</span>
            acima indicam que as regras para permitir acesso se aplicam a todos os recursos.
        </p>
    </div>

    <div class="section" id="zend.acl.introduction.querying"><div class="info"><h1 class="title">Consultando uma ACL</h1></div>
        

        <p class="para">
            Temos agora uma <acronym class="acronym">ACL</acronym> flexível que pode ser usada para determinar quais
            solicitantes têm permissão para executar funções através da aplicação web.
            Realizar consultas é bastante simples usando o método
             <span class="methodname">isAllowed()</span>:
        </p>

        <pre class="programlisting brush: php">
echo $acl-&gt;isAllowed(&#039;visitante&#039;, null, &#039;visualizar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;equipe&#039;, null, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;equipe&#039;, null, &#039;revisar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;editor&#039;, null, &#039;visualizar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// &#039;permitido&#039; por conta da herança de &#039;visitante&#039;

echo $acl-&gt;isAllowed(&#039;editor&#039;, null, &#039;atualizar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// &#039;negado&#039; pois não há regra &#039;atualizar&#039;

echo $acl-&gt;isAllowed(&#039;administrador&#039;, null, &#039;visualizar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido, pois administrador é permitido a todos os privilégios

echo $acl-&gt;isAllowed(&#039;administrador&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido, pois administrador é permitido a todos os privilégios

echo $acl-&gt;isAllowed(&#039;administrador&#039;, null, &#039;atualizar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido, pois administrador é permitido a todos os privilégios
</pre>

    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.html">Zend_Acl</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.acl.refining.html">Refinando Controles de Acesso</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.acl.html">Zend_Acl</a></li>
  <li class="active"><a href="zend.acl.introduction.html">Introdu&ccedil;&atilde;o</a></li>
  <li><a href="zend.acl.refining.html">Refinando Controles de Acesso</a></li>
  <li><a href="zend.acl.advanced.html">Uso Avan&ccedil;ado</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>